<?php
// usuarios/models/DbTable/Usuarios.php

/**
 * Clase de la tabla usuarios.
 */
class Usuarios_Model_DbTable_Usuarios extends Zend_Db_Table_Abstract {
	/** Table name */
	protected $_name = 'usuarios';
	protected $_primary = 'codusuario';
	protected $_sequence = 'seq_usuarios';
	protected $_rowClass = 'App_Audit_Row';
	
	/**
	 * Devuelve el objeto Zend_Db_Select con una consulta a todos los registros de la
	 * tabla usuarios
	 * @return Zend_Db_Select
	 */
	public function getSelectFetchAll($codsede="",$busqueda) {
        $select = $this->select ()
                   ->from(array("u"=>"usuarios"),array ('u.codusuario','u.nombreusuario','u.nombres','u.apellidos','u.emailexterno','u.direccionresidencia','u.estado') )
                   ->join(array('ub'=>'ubicaciongeografica'),'ub.codubicacion=u.codubicacion',array('ub.nombreubicacion ||\', \'|| (SELECT u1.nombreubicacion FROM ubicaciongeografica u1 WHERE u1.codubicacion=ub.codpadre  ) AS ubicacion'))
//			       ->where('estado=?',1)
			       ->order( array ('nombreusuario ASC' ) );
	    $select->setIntegrityCheck(false);
	    
	    
	    if (!empty($codsede)){
	        $select->where("codusuario IN (SELECT i.codusuario FROM usuariossede i WHERE i.codsede={$codsede})");
	    }
	    
//            Zend_Debug::dump($select->__toString());
			 return $select->query()->fetchAll();
	}
	
	/**
	 * Devuelve un arreglo de usuarios por rol
	 * @return Array
	 */
	public function getSelectUsuariosRolFetchAll($codrol) {
		$columns = array('u.codusuario','u.tipodocumento','u.cedula','u.nombreusuario','u.apellidos','u.nombres','u.emailexterno','u.direccionresidencia','u.codubicacion','u.estado');
		$orderby = array('u.codusuario');
		$select = $this->select()
		            ->from(array('u' => 'usuarios'),$columns)
		            ->joinCross(array('ru' => 'rolesusuarios'),array())
                    ->join(array('ub'=>'ubicaciongeografica'),'ub.codubicacion=u.codubicacion',array('ub.nombreubicacion ||\', \'|| (SELECT u1.nombreubicacion FROM ubicaciongeografica u1 WHERE u1.codubicacion=ub.codpadre  ) AS ubicacion'))
		            ->where("u.codusuario=ru.codusuario")
		            ->where("ru.codrol=?",$codrol)
		            ->where('u.estado=?',1)
		            ->order($orderby);
		$select->setIntegrityCheck(false);
		return $select->query()->fetchAll();
	}

	/**
	 * Asigna el rol como favorito para el usuario
	 * @param int $codusuario
	 * @param int $codrol
	 */
	public function asignarRolFavorito($codusuario, $codrol) {
		$this->getAdapter()->beginTransaction();
		$this->getAdapter()->update("rolesusuarios", array("favorito"=>"N"), "codusuario={$codusuario}");
		$this->getAdapter()->update("rolesusuarios", array("favorito"=>"S"), "codusuario={$codusuario} AND codrol={$codrol}");
		$this->getAdapter()->commit();
	}

	public function getSelectUsuarios($criterio,$datos) {
		$select = $this->select()
						->from(array('u'=>'usuarios'))
						->where('u.estado=?',1)
						->order('u.nombres','ASC')
						->order('u.estado');
						
        if ($criterio=="SEDES"){
                 $select->join(array('us'=>'usuariossede'),'us.codusuario=u.codusuario',array('tipousuario'));
				 $select->where('us.codsede=?', $datos["codsede"]);
        }
        if ($criterio=="PLANES"){
                 $select->join(array('up'=>'usuariosplan'),'up.codusuario=u.codusuario',NULL);
				 $select->where('up.codplanmejoramiento=?', $datos["codplanmejoramiento"]);
        }
        if ($criterio=="DIMENSIONES"){
                 $select->join(array('up'=>'usuariosdimension'),'up.codusuario=u.codusuario',NULL);
				 $select->where('up.coddimension=?', $datos["coddimension"]);
        }
        if ($criterio=="INDICADORES"){
                 $select->join(array('up'=>'usuariosindicador'),'up.codusuario=u.codusuario',NULL);
				 $select->where('up.codindicador=?', $datos["codindicador"]);
        }
						
		$select->setIntegrityCheck(false);
//		echo $select->__toString();
		return $select->query()->fetchAll();
	}

	
	/**
	 * Devuelve el conjunto de registros de usuarios que pertenecen al/los
	 * roles padre especificados
	 * @param array|int $roles codigos de roles padre
	 * @return array
	 */
	public function getUsuariosPorRolPadre($roles,$datos=array(),$count=false) {
	    if(!is_array($roles)) {
	        $roles = array($roles);
	    }
	    $rolesBuscar = implode(",", $roles);

	    if ($count){
    	    $select = $this->select()
    						->from(array('u'=>'usuarios'),array("COUNT(u.codusuario) AS cantidad"))
    						->join(array('ru'=>'rolesusuarios'),'u.codusuario=ru.codusuario', null)
    						->join(array('r'=>'rol'),'r.codrol=ru.codrol AND r.codpadre IN ('.$rolesBuscar.')', null)
    						->where('sacescna in (2,3)');
    		$select->setIntegrityCheck(false);
	    }else{
    	    $select = $this->select()
    						->from(array('u'=>'usuarios'))
    						->columns(array ( 'obtener_ubicacion(u.codubicacion,\'asc\',2,\', \') as ubicacion'))
    						->join(array('ru'=>'rolesusuarios'),'u.codusuario=ru.codusuario', null)
    						->join(array('r'=>'rol'),'r.codrol=ru.codrol AND r.codpadre IN ('.$rolesBuscar.')', null)
    						->where('sacescna in (2,3)')
    						->order('u.nombres','ASC');
    						
            if (isset($datos["desde"]) && isset($datos["pag"]) ){
                if ($datos["pag"]!=1){
                    $pag = intval($datos["pag"])*intval($datos["desde"]);
                }
    			$select->limit($datos["desde"],$pag);
            }
            
    		//FIXME eliminar el limit es de prueba
    		$select->setIntegrityCheck(false);
    		
    		if (in_array(Roles_Model_Roles::CODPADRE_PAR,$roles)){
//    		    $select->joinLeft(array("i1"=>"informacionpar_cna"),"i1.codusuario=u.codusuario AND i1.codinformacion=(SELECT i2.codinformacion FROM informacionpar_cna AS i2 WHERE i2.codusuario=u.codusuario AND i2.codnivel >= 4 ORDER BY i2.fechaformacion DESC LIMIT 1 )", array("i1.tituloformacion AS titulo"));
    		    
    //		    $select->columns(array("(SELECT i.tituloformacion FROM informacionpar_cna i WHERE i.codusuario=u.codusuario AND i.codnivel = '4' ORDER BY fechaformacion DESC LIMIT 1 ) " ));
    //		    $select->columns(array("(SELECT n.nombrenivel FROM informacionpar_cna i, nivelacademico n WHERE i.codnivel=n.codnivel AND i.codusuario=u.codusuario ORDER BY n.orden_nivel DESC LIMIT 1 ) AS nivel" ));
    //		    $select->columns(array("(SELECT i.nombreinstitucion FROM informacionpar_cna i WHERE i.codusuario=u.codusuario AND i.tipo = '9' ORDER BY fechaingreso DESC LIMIT 1 ) AS trabajo" ));
    		}
	    }
	    
		$condicion ="";
		if (!empty($datos["nombre"])){
		    $cedula = intval($datos["nombre"]);
		    if (!empty($cedula) && is_int($cedula)){
		        $condicion ="OR u.cedula='{$cedula}' ";
		    }else{
  		        $valor_otra_busqueda = str_replace(array("Á","É","Í","Ó","Ú","á","é","í","ó","ú"),array("A","E","I","O","U","a","e","i","o","u"),$datos["nombre"]);
	            $condicion ="OR u.nombres LIKE '%{$datos["nombre"]}%' OR u.apellidos LIKE '%{$datos["nombre"]}%'
	        				OR nombres LIKE '%{$valor_otra_busqueda}%' OR apellidos LIKE '%{$valor_otra_busqueda}%' ";
		    }
		}
		if (!empty($datos["extranjero"])){
            $select->Where("SELECT 2 <> (SELECT codpadre FROM ubicaciongeografica WHERE codubicacion = (SELECT codpadre FROM ubicaciongeografica WHERE codubicacion=u.codubicacionnacimiento))");
		}
		if (!empty($datos["codubicacion1"])){
            $select->Where("u.codubicacion<>?",$datos["codubicacion1"]);
		}
		if (!empty($datos["codubicacion2"])){
            $select->Where("u.codubicacion=?",$datos["codubicacion2"]);
		}
		if (!empty($datos["fechaformaciond"]) && !empty($datos["fechaformacionh"])){
            $select->Where("u.fechacapacitacion BETWEEN '{$datos["fechaformaciond"]}' AND '{$datos["fechaformacionh"]}'");
		}
		
		$condicion_formacion = "";
		if (!empty($datos["codnivel"])){
		     $condicion_formacion .= "AND i.codnivel = '{$datos["codnivel"]}' ";
		}
		if (!empty($datos["codclasificacionarea"])){
            $condicion_formacion .= "AND i.codclasificacionarea = '{$datos["codclasificacionarea"]}' ";
		}
		if (!empty($datos["titulo"])){
		    $condicion_formacion .= "AND i.tituloformacion LIKE '%{$datos["titulo"]}%' ";
		}
		if (!empty($datos["institucion"])){
		    $condicion_formacion .= "AND i.nombreinstitucion LIKE '%{$datos["institucion"]}%' ";
		}
		if (!empty($datos["sector"])){
		    $condicion_formacion .= "AND i.sectorproductivo = {$datos["sector"]} ";
		}
		if (!empty($condicion_formacion)){
		    $condicion_formacion = substr($condicion_formacion,4);
//            $select->Where("u.codusuario IN (SELECT codusuario FROM informacionpar_cna WHERE {$condicion_formacion}) ");
            $select->joinLeft(array("i"=>"informacionpar_cna"),"i.codusuario=u.codusuario AND {$condicion_formacion} ", null);
		}
		
		if (!empty($condicion)){
		    $condicion = substr($condicion,3);
		    $select->Where($condicion);
		}
		
//		Zend_Debug::dump($select->__toString());
		return $select->query()->fetchAll();
	}
	
	public function fetchAuto($criterio="SEDES",$valor_busqueda,$datos=array()) {
        $select = $this->select()
                        ->distinct()
						->from(array('u'=>'usuarios'),array('u.codusuario','u.nombres','u.apellidos','u.nombreusuario'))
						->join(array('ru'=>'rolesusuarios'),'u.codusuario=ru.codusuario',NULL)
						->where('u.estado=?',1)
						->Where(" UPPER(translate(nombres, 'áéíóúÁÉÍÓÚ', 'aeiouAEIOU')) LIKE UPPER(translate('%{$valor_busqueda}%', 'áéíóúÁÉÍÓÚ', 'aeiouAEIOU'))
								  OR UPPER(translate(apellidos, 'áéíóúÁÉÍÓÚ', 'aeiouAEIOU')) LIKE UPPER(translate('%{$valor_busqueda}%', 'áéíóúÁÉÍÓÚ', 'aeiouAEIOU'))
								  OR UPPER(translate(nombreusuario, 'áéíóúÁÉÍÓÚ', 'aeiouAEIOU')) LIKE UPPER(translate('%{$valor_busqueda}%', 'áéíóúÁÉÍÓÚ', 'aeiouAEIOU'))
						")
						->order('u.nombres','ASC');
						
		if ($criterio=="SEDES"){
				$select->joinLeft(array("us"=>"usuariossede"), "us.codusuario=u.codusuario",NULL);
				$select->joinLeft(array("r"=>"rol"), "r.codrol=ru.codrol AND r.codpadre=3",NULL);
				$select->where('us.codusuario IS NULL');
		}
						
		if ($criterio=="PLANES"){
				$select->joinLeft(array("up"=>"usuariosplan"), "up.codusuario=u.codusuario AND up.codplanmejoramiento={$datos["codplanmejoramiento"]}",NULL);
				$select->where('up.codusuario IS NULL');
		}
						
		if ($criterio=="DIMENSIONES"){
				$select->joinLeft(array("ud"=>"usuariosdimension"), "ud.codusuario=u.codusuario AND ud.coddimension={$datos["coddimension"]}",NULL);
				$select->where('ud.codusuario IS NULL');
		}
						
		if ($criterio=="INDICADORES"){
				$select->joinLeft(array("ui"=>"usuariosindicador"), "ui.codusuario=u.codusuario AND ui.codindicador={$datos["codindicador"]}",NULL);
				$select->where('ui.codusuario IS NULL');
		}
						
		$select->setIntegrityCheck(false);
//		echo $select->__toString();
		return $select->query()->fetchAll();
	}
	
}//fin de la clase
